


import abstraccionesGeometricas.Intervalo;
import abstraccionesGeometricas.Punto;
import funciones.*;
import operaciones.*;
import excepciones.NoExisteInterseccion;


public class Principal {

	public static void main(String[] args) {
		
		System.out.println("*******************************************************");
		System.out.println("* Algoritmos y Programacion III Cat. Fontela          *");
		System.out.println("* Trabajo Practico : Graficador de Funciones          *");
		System.out.println("* Primera Parte                                       *");
		System.out.println("*******************************************************");
		System.out.println("");
		System.out.println("Esta aplicacion muestra el funcionamiento de la API de Funciones Matematicas");
		System.out.println("");
		System.out.println("Se van a definir las funciones:");
		System.out.println("F(x) = 3*(x^2) y G(x) = x+1 ");

		System.out.println("Y realizar calculos sobre ellas en el intervalo I=[0,3]");
		//f(x)=3(x^2)
		Funcion f=new OperacionEntreFunciones(new Potencia(2),new Constante(3), new Producto());
		//f(x)=x+1
		Funcion g=new OperacionEntreFunciones(new Potencia(1),new Constante(1), new Suma());
		//I=(0,3)
		Intervalo intervalo=new Intervalo(0,3);
		
		System.out.print("Evaluar g en 2.");
		System.out.print("	Resultado = ");
		System.out.println(g.evaluar(2));
		System.out.print("Maximo de g");
		System.out.print("	Resultado = ");
		System.out.println(OperacionSobreFunciones.maximo(g, intervalo));
		System.out.print("Minimo de g");
		System.out.print("	Resultado = ");
		System.out.println(OperacionSobreFunciones.minimo(g, intervalo));
		System.out.print("Derivada de g en 2");
		System.out.print("	Resultado = ");
		System.out.println(OperacionSobreFunciones.calcularDerivada(g,2));
		System.out.print("Integral de g ");
		System.out.print("	Resultado = ");
		System.out.println(OperacionSobreFunciones.calcularIntegral(g, intervalo));
		
		System.out.print("Evaluar f en 2");
		System.out.print("	Resultado = ");
		System.out.println(f.evaluar(2));
		System.out.print("Maximo de f");
		System.out.print("	Resultado = ");
		System.out.println(OperacionSobreFunciones.maximo(f, intervalo));
		System.out.print("Minimo de f");
		System.out.print("	Resultado = ");
		System.out.println(OperacionSobreFunciones.minimo(f, intervalo));
		System.out.print("Derivada de f en 2");
		System.out.print("	Resultado = ");
		System.out.println(OperacionSobreFunciones.calcularDerivada(f, 2));
		System.out.print("Integral de f");
		System.out.print("	Resultado = ");
		System.out.println(OperacionSobreFunciones.calcularIntegral(f, intervalo));
		
		try {
		Punto interseccion= OperacionSobreFunciones.interseccionConOtraFuncion(f, g, intervalo);
		System.out.print("Interseccion entre f y g");
		System.out.print("	Resultado = ");
		System.out.println(interseccion.toString());
		}
		catch (NoExisteInterseccion e){
			System.out.print("No existe Interseccion entre f y g");
		}
		
//		f(x)=3((x+1)^2)
		System.out.println("");
		System.out.println("Ahora creamos una nueva funcion h que es la composicion de f con g: h=f(g(x)).");
		System.out.println("Y realizamos algunos calculos sobre ella en el intervalo I=[0,3]");
		Funcion h=new OperacionEntreFunciones(f,g,new Composicion());
		System.out.print("Evaluar h en 2");
		System.out.print("	Resultado = ");
		System.out.println(h.evaluar(2));
		System.out.print("Maximo de h");
		System.out.print("	Resultado = ");
		System.out.println(OperacionSobreFunciones.maximo(h, intervalo));
		System.out.print("Minimo de h");
		System.out.print("	Resultado = ");
		System.out.println(OperacionSobreFunciones.minimo(h, intervalo));
		System.out.print("Derivada de h en 2");
		System.out.print("	Resultado = ");
		System.out.println(OperacionSobreFunciones.calcularDerivada(h,2));
		System.out.print("Integral de h ");
		System.out.print("	Resultado = ");
		System.out.println(OperacionSobreFunciones.calcularIntegral(h, intervalo));
		
		}
}


